using UnityEngine;

namespace Enemy{
public class IdleState : IState //站立
{
    private FSM manager;
    private Parameter parameter;
    //private float timer;

    public IdleState(FSM manager)
    {
        this.manager = manager;
        this.parameter = manager.parameter;
    }

    public void OnEnter()
    {
        parameter.anim.Play("Idle");
    }

    public void OnUpdate()
    {
        if (Physics2D.OverlapCircle(parameter.attackPoint.position, parameter.attackArea, parameter.targetLayer))
        {
            parameter.target = Physics2D
                .OverlapCircle(parameter.attackPoint.position, parameter.attackArea, parameter.targetLayer).transform;
            manager.TransitionState(StateType.Attack1);
        }
        // switch (manager.tag)
        // {
        //     case "PE":
        //      timer += Time.deltaTime;
        //      if (timer >= parameter.idleTime)
        //      {
        //             manager.TransitionState(StateType.Patrol);
        //      }
        //      break;
        //     case "SE":
        //      if (Physics2D.OverlapCircle(parameter.attackPoint.position, parameter.attackArea, parameter.targetLayer))
        //      {
        //          parameter.target = Physics2D.OverlapCircle(parameter.attackPoint.position, parameter.attackArea, parameter.targetLayer).transform;
        //          manager.TransitionState(StateType.Attack1);
        //      }
        //      break;
        // }
    }

    public void OnExit()
    {
        //timer = 0;
    }
}

public class Attack1State : IState //攻击方式1
{
    private FSM manager;
    private Parameter parameter;

    public Attack1State(FSM manager)
    {
        this.manager = manager;
        this.parameter = manager.parameter;
    }

    public void OnEnter()
    {
        parameter.anim.Play("Attack1");
    }

    public void OnUpdate()
    {
        manager.FlipTo(parameter.target);
        if (Physics2D.OverlapCircle(parameter.attackPoint.position, parameter.attackArea, parameter.targetLayer))
        {
            parameter.target = Physics2D
                .OverlapCircle(parameter.attackPoint.position, parameter.attackArea, parameter.targetLayer).transform;
        }
        else
        {
            parameter.target = null;
            manager.TransitionState(StateType.Idle);
        }

        // switch (manager.tag)
        // {
        //     case "PE":
        //         parameter.stateInfo = parameter.anim.GetCurrentAnimatorStateInfo(0);
        //         if (parameter.stateInfo.normalizedTime >= 0.95f)
        //         {
        //             manager.pc.ChangeHealth(-10);
        //             manager.TransitionState(StateType.Chase);
        //         }
        //         break;
        //
        //     case "SE":
        //         manager.FlipTo(parameter.target);
        //         if (Physics2D.OverlapCircle(parameter.attackPoint.position, parameter.attackArea, parameter.targetLayer))
        //         {
        //             parameter.target = Physics2D.OverlapCircle(parameter.attackPoint.position, parameter.attackArea, parameter.targetLayer).transform;
        //         }
        //
        //         else
        //         {
        //             parameter.target = null;
        //             manager.TransitionState(StateType.Idle);
        //         }
        //         break;
        // }
    }

    public void OnExit()
    {

    }
}

public class WindState : IState
{
    private FSM manager;
    private Parameter parameter;

    public WindState(FSM manager)
    {
        this.manager = manager;
        this.parameter = manager.parameter;

    }

    public void OnEnter()
    {
        parameter.anim.Play("Wind");
    }

    public void OnUpdate()
    {
        parameter.stateInfo = parameter.anim.GetCurrentAnimatorStateInfo(0);
        if (parameter.stateInfo.IsName("Wind") && parameter.stateInfo.normalizedTime >= 0.95f)
        {
            manager.TransitionState(StateType.Idle);
        }
    }

    public void OnExit()
    {

    }
}

public class GravityState : IState
{
    private FSM manager;
    private Parameter parameter;

    public GravityState(FSM manager)
    {
        this.manager = manager;
        this.parameter = manager.parameter;

    }

    public void OnEnter()
    {
        parameter.anim.Play("Gravity");
    }

    public void OnUpdate()
    {
        parameter.stateInfo = parameter.anim.GetCurrentAnimatorStateInfo(0);
        if (parameter.stateInfo.IsName("Gravity") && parameter.stateInfo.normalizedTime >= 0.95f)
        {
            manager.TransitionState(StateType.Idle);
        }
    }

    public void OnExit()
    {

    }
}



// public class Attack2State : IState       //攻击方式2
// {
//     private FSM manager;
//     private Parameter parameter;
//
//     public Attack2State(FSM manager)
//     {
//         this.manager = manager;
//         this.parameter = manager.parameter;
//     }
//     public void OnEnter()
//     {
//         parameter.anim.Play("Attack2");
//         manager.pc.ChangeHealth(-15);
//     }
//
//     public void OnUpdate()
//     {
//         switch(manager.tag)
//         {
//             case "PE":
//                 parameter.stateInfo = parameter.anim.GetCurrentAnimatorStateInfo(0);
//                 if (parameter.stateInfo.normalizedTime >= 0.95f)
//                 {
//                     manager.TransitionState(StateType.Chase);
//                 }
//                 break;
//         }
//     }
//
//     public void OnExit()
//     {
//
//     }
// }

// public class LungeAttack : IState       //突刺攻击
// {
//     private FSM manager;
//     private Parameter parameter;
//
//     public LungeAttack(FSM manager)
//     {
//         this.manager = manager;
//         this.parameter = manager.parameter;
//     }
//     public void OnEnter()
//     {
//         parameter.anim.Play("LungeAttack");
//     }
//
//     public void OnUpdate()
//     {
//         if (Vector2.Distance(manager.transform.position, parameter.target.transform.position) < 1f)
//         {
//             manager.pc.ChangeHealth(-10);
//         }
//         parameter.stateInfo = parameter.anim.GetCurrentAnimatorStateInfo(0);
//         if (parameter.stateInfo.normalizedTime >= 0.95f && parameter.stateInfo.IsName("LungeAttack"))
//         { 
//             manager.TransitionState(StateType.Chase);
//         }
//                 
//         
//     }
//
//     public void OnExit()
//     {
//
//     }
// }
// public class DeathState : IState        //通用的死亡状态
// {
//     private FSM manager;
//     private Parameter parameter;
//
//     public DeathState(FSM manager)
//     {
//         this.manager = manager;
//         this.parameter = manager.parameter;
//     }
//     public void OnEnter()
//     {
//         parameter.rbody.simulated = false;
//         parameter.anim.Play("Death");
//     }
//
//     public void OnUpdate()
//     {
//         parameter.stateInfo = parameter.anim.GetCurrentAnimatorStateInfo(0);
//         if (parameter.stateInfo.normalizedTime >= 0.95f && parameter.stateInfo.IsName("Death"))
//         {
//             MonoBehaviour.Destroy(manager.gameObject);
//         }
//     }
//
//     public void OnExit()
//     {
//
//     }
// }

// public class HitState : IState //受击
// {
//     private FSM manager;
//     private Parameter parameter;
//
//     public HitState(FSM manager)
//     {
//         this.manager = manager;
//         this.parameter = manager.parameter;
//     }
//
//     public void OnEnter()
//     {
//         parameter.anim.Play("Hit");
//         switch (parameter.hurttag)
//         {
//             case "Attack1":
//                 parameter.health -= 1;
//                 break;
//             case "Attack2":
//                 parameter.health -= 2;
//                 break;
//         }
//     }
//
//     public void OnUpdate()
//     {
//         parameter.stateInfo = parameter.anim.GetCurrentAnimatorStateInfo(0);
//         switch (manager.tag)
//         {
//             case "PE":
//                 if (parameter.stateInfo.normalizedTime >= 0.95f && parameter.stateInfo.IsName("Hit"))
//                 {
//                     parameter.bc.enabled = true;
//                     //manager.TransitionState(StateType.LungeAttack);
//                 }
//
//                 break;
//             case "SE":
//                 if (parameter.stateInfo.normalizedTime >= 0.95f && parameter.stateInfo.IsName("Hit"))
//                 {
//                     manager.TransitionState(StateType.Attack1);
//                 }
//
//                 break;
//         }
//     }
//
//     public void OnExit()
//     {
//
//     }
// }

// public class Jump1State : IState           //起跳
// {
//     private FSM manager;
//     private Parameter parameter;
//
//     public Jump1State(FSM manager)
//     {
//         this.manager = manager;
//         this.parameter = manager.parameter;
//     }
//     public void OnEnter()
//     {
//         parameter.anim.Play("Jump1");
//         parameter.rbody.AddForce(new Vector2(0f, 15f), ForceMode2D.Impulse);
//     }
//
//     public void OnUpdate()
//     {
//         manager.FlipTo(parameter.target);
//         if (parameter.rbody.velocity.y < 0)
//         {
//             manager.TransitionState(StateType.Jump2);
//         }
//     }
//
//     public void OnExit()
//     {
//
//     }
// }

// public class Jump2State : IState           //落地
// {
//     private FSM manager;
//     private Parameter parameter;
//
//     public Jump2State(FSM manager)
//     {
//         this.manager = manager;
//         this.parameter = manager.parameter;
//     }
//     public void OnEnter()
//     {
//         parameter.anim.Play("Jump2");
//     }
//
//     public void OnUpdate()
//     {
//         manager.FlipTo(parameter.target);
//         if (parameter.rbody.velocity.y == 0)
//         {
//             manager.TransitionState(StateType.Idle);
//         }
//     }
//
//     public void OnExit()
//     {
//
//     }
// }
// public class PatrolState : IState         //巡逻
// {
//     private FSM manager;
//     private Parameter parameter;
//     private int patrolIndex = 0;
//
//     public PatrolState(FSM manager)
//     {
//         this.manager = manager;
//         this.parameter = manager.parameter;
//     }
//     public void OnEnter()
//     { 
//         parameter.anim.Play("Walk");
//     }
//
//     public void OnUpdate()
//     {
//         if(parameter.target == null) {
//             PlayerController player = (PlayerController)UnityEngine.Object.FindAnyObjectByType(typeof(PlayerController), FindObjectsInactive.Include);
//             parameter.target = player.transform;
//         }
//         if (Physics2D.Raycast(manager.transform.position, new Vector2(parameter.target.position.x - manager.transform.position.x, 0), 1.5f, LayerMask.GetMask("Background")) && parameter.rbody.velocity.y == 0)
//         {
//             parameter.rbody.AddForce(new Vector2(0f, 15f), ForceMode2D.Impulse);
//         }
//         
//         manager.FlipTo(parameter.patrolPoints[patrolIndex]);
//         
//         manager.transform.position = Vector2.MoveTowards(manager.transform.position,parameter.patrolPoints[patrolIndex].position,parameter.moveSpeed * Time.deltaTime);
//
//         if (Mathf.Abs(manager.transform.position.x - parameter.patrolPoints[patrolIndex].position.x) < 1f)
//         {
//             manager.TransitionState(StateType.Idle);
//         }
//     }
//
//     public void OnExit()
//     { 
//         patrolIndex = (patrolIndex + 1) % parameter.patrolPoints.Length;
//     }
// }
//
//
// public class ChaseState : IState           //追逐
// {
//     private FSM manager;
//     private Parameter parameter;
//
//     public ChaseState(FSM manager)
//     {
//         this.manager = manager;
//         this.parameter = manager.parameter;
//     }
//     public void OnEnter()
//     {
//         parameter.anim.Play("Run");
//     }
//
//     public void OnUpdate()
//     {
//         manager.FlipTo(parameter.target);
//         
//         
//         if (Physics2D.Raycast(manager.transform.position, new Vector2(parameter.target.position.x - manager.transform.position.x, 0), 1.5f, LayerMask.GetMask("Background")) && Math.Abs(parameter.rbody.velocity.y) <= 0.1f)
//         {
//             parameter.rbody.AddForce(new Vector2(0f, 15f), ForceMode2D.Impulse);
//         }
//         
//         if (parameter.target)
//         {
//             manager.transform.position = Vector2.MoveTowards(manager.transform.position,parameter.target.position,parameter.chaseSpeed * Time.deltaTime);
//         }
//
//         if (parameter.target == null || manager.transform.position.x < parameter.chasePoints[0].position.x || manager.transform.position.x > parameter.chasePoints[1].position.x)
//         { 
//             manager.TransitionState(StateType.Idle);
//         }
//
//         if (Physics2D.OverlapCircle(parameter.attackPoint.position, parameter.attackArea, parameter.targetLayer))
//         {
//             int random = UnityEngine.Random.Range(0, 2);
//             if (random == 0)
//             {
//                 manager.TransitionState(StateType.Attack1);
//             }
//             else
//             {
//                 manager.TransitionState(StateType.Attack2);
//             }
//         }
//     }
//
//     public void OnExit()
//     {
//
//     }
// }
}




